library(readr)
library(tidyverse)
library(forcats)
library(plotly)
library(knitr, warn.conflicts = FALSE, quietly=TRUE)
library(RColorBrewer)
library(stringr)
library(dygraphs)
library(xts)
myPalette <- brewer.pal(8, "YlGn")
vgsales <- read_csv("vgsales.csv")
Rows: 16598 Columns: 11
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (5): Name, Platform, Year, Genre, Publisher
dbl (6): Rank, NA_Sales, EU_Sales, JP_Sales, Other_Sales, Global_Sales

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Die idee des Projekts ist die Analyse der Video Game Releases im laufe der Jahre von 1980-2016.

Zuerst schauen wir und sie Anzahl der Videospiele und die Anzahl der verkäufe im laufe der Jahre an. Hierzu verwenden wir Scatter Plots


grouped <- vgsales  %>%                                 
  group_by(Year) %>%
  dplyr::summarize(Anzahl =n()) %>% filter(Year!='N/A')%>%filter(Year!=2020) %>% filter(Year!='2017') %>%
  as.data.frame()


filtered <- grouped %>% select(Year,Anzahl)

ax <- list(
  title = "Year"
)

ay <- list(
  title = "Amount"

)

filtered %>%
plot_ly(x = ~Year, y = ~Anzahl, type = 'scatter', mode = 'lines', fill = 'tozeroy') %>% 
  layout(title="Game Amount from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )

grouped <- vgsales  %>%                                 
  group_by(Year) %>%
  dplyr::summarize(gr_sum = sum(Global_Sales)) %>% filter(Year!='N/A')%>%filter(Year!=2020) %>% filter(Year!='2017') %>%
  as.data.frame()


filtered <- grouped %>% select(Year,gr_sum)

ax <- list(
  title = "Year"
)

ay <- list(
  title = "Sales Per Game (in mio)"

)

filtered %>%
plot_ly(x = ~Year, y = ~gr_sum, type = 'scatter', mode = 'lines', fill = 'tozeroy') %>% 
  layout(title="Sales per Game from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )

grouped <- vgsales  %>%                                 
  group_by(Year) %>%
  dplyr::summarize(gr_sum = sum(Global_Sales)/n()) %>% filter(Year!='N/A')%>%filter(Year!=2020) %>% filter(Year!='2017') %>%
  as.data.frame()


filtered <- grouped %>% select(Year,gr_sum)

ax <- list(
  title = "Year"
)

ay <- list(
  title = "Sales per Year(in mio)"

)

filtered %>%
plot_ly(x = ~Year, y = ~gr_sum, type = 'scatter', mode = 'lines', fill = 'tozeroy') %>% 
  layout(title="Sales per Game from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )

Hier erkennen wir das 2008 und 2009 die Jahre waren in denen die Meisten Games Releast wurden und diese auch die meisten Verkäufe haben. Den größten per Game Verkaufswert gab es allerdings 1984,1985 und 1989. Neuere spiele hingegen verkaufen sich durchschnittlich schlechter was durch das größere Angebot auch zu erwarten ist.

Nun betrachten wir die Anzahl der Videospiele aufgelistet nach Platform.

Hierbei stellt sich die Frage ob ältere Plattformen mehr Spielereleases haben wovon auszugehen ist. Hierzu verwenden wir ein einfaches Balkendiagramm welche eine gute erste übersicht bietet.

grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(Anzahl =n()) 

ordered <- grouped[order(grouped$Anzahl), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "Anzahl"
)
ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Anzahl, .desc="true"),
           y=~Anzahl,
           name="Game Amount by Platform") %>% 
  layout(title="Game Amount by Platform",
         xaxis = ax,
         yaxis = ay
         
         )

Dies lässt sich nicht generell bestätigen aber ein Trend ist definitiv erkennbar.

Nun stellt sich die Frage welche Plattform die meisten Sales hat.

grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(sum(Global_Sales))  %>%
rename(
    Global_Sales = "sum(Global_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Platform"
)

ay <- list(
  title = "Global Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales Amount by Platform") %>% 
  layout(title="Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )

Wie sich herausstellt ist dies jedoch nicht die Platform welches die meisten Gamereleases hat.

Nun analzsieren wir die unterschiede der Regionen.

Hierzu verwenden wir Sowohl sorted bar plots sowie der abwechslungshalber pie charts.

Einzuwenden hierbei ist das die Regionen natürlich unterschiedlich viele Einwohner haben ein vergleich der Absoluten Saleswerte ist hierbei natürlich nur wenig ausschlaggebend zeigt aber einen generellen beliebtheitstrend der Konsolen auf.

grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(sum(EU_Sales))  %>%
rename(
    Global_Sales = "sum(EU_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Platform"
)

ay <- list(
  title = "EU Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="EU Sales Amount by Platform") %>% 
  layout(title="EU Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )
ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Platform,textinfo='label+percent',
           name="EU Sales Amount by Publisher") %>% 
  layout(title="EU Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )
grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(sum(NA_Sales))  %>%
rename(
    Global_Sales = "sum(NA_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Platform"
)

ay <- list(
  title = "NA Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="NA Sales Amount by Platform") %>% 
  layout(title="NA Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )
ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Platform,textinfo='label+percent',
           name="NA Sales Amount by Publisher") %>% 
  layout(title="NA Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )
grouped <- vgsales  %>% 
  group_by(Platform) %>% 
  summarize(sum(JP_Sales))  %>%
rename(
    Global_Sales = "sum(JP_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Platform <- as_factor(ordered$Platform)


ax <- list(
  title = "Platform"
)

ay <- list(
  title = "JP Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Platform,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="JP Sales Amount by Platform") %>% 
  layout(title="JP Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )
ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Platform,textinfo='label+percent',
           name="JP Sales Amount by Platform") %>% 
  layout(title="JP Sales Amount by Platform",
         xaxis = ax,
         yaxis = ay
         )

Wohingegen in EU sony mit der PS2 und PS3 die liste anführt hat in den USA Microsoft mit der Xbox360 die Nase vorn. In Japan hingegen ist wie zu erwarten Nintendo mit dem DS der Markführer.

Um sich das Ganze etwas genauer anzuschauen betrachten wir die Anzahl der Sales per Platform im Verlauf der Jahre.

Um eine überladung des Diagramms zu verhindern werden hier allerdings nur Plattformen mit mindestens 60 mio in Sales im entsprechenden Jahr berücksichtigt. Dies hat den Nachteil das einige z.T wichtige Daten Fehlen, ein Weglassen ebenjenes Filters fürt aber zu kompletter unübersichtlichkeit.

Hier erkennen wir das Platform, wie zu erwarten, meist kurz nach Release die größten verkäufe verzeichnen.

Nun stellt sich die Frage ob sich neben bestimmten Platformen auch bestimmte Entwickler/Publisher häufen. Hierbei gehen wir davon aus das vermutlich Nintendo und EA die liste anführen. Hierzu verwenden wir wiederum sorted Bar Charts und kürzen die Namen und die Begriffe “Entertainment”, “Interactive” und “Studios” da dies die Namen nur unnötig verlängert und Filtern Publisher mit Geringen Anzahl an Game Releases.

grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n()) %>%  
  filter(Anzahl>100) %>% filter(Publisher!="Unknown")

ordered <- grouped[order(grouped$Anzahl), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "Anzahl"
)
ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Anzahl, .desc="true"),
           y=~Anzahl,
           name="Game Amount by Publisher") %>% 
  layout(title="Game Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         
         )
grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n(),sum(Global_Sales)) %>%
  filter(Anzahl>100) %>%
rename(
    Global_Sales = "sum(Global_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "Global Sales (in mio)"

)


ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales Amount by Publisher") %>% 
  layout(title="Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )

Auffällig ist hier die diskrepanz zwischen Anzahl der Spielereleases und Anzahl der Spieleverkäufe. Im gegensatz zu der Anzahl der Spiele (bei dem Nintendo nur auf platz 6 Sitz) dominiert Nintendo im anzahl der Sales.

Nun stellt sich wieder einmal die Frage ob sich dies in Bestimmten teilen der Welt unterscheidet und hierzu verwenden wir wiederum die SortedBar/Piechart kombo und die bereits genannten Filter

grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n(),sum(EU_Sales)) %>%
  filter(Anzahl>100) %>%
rename(
    Global_Sales = "sum(EU_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "EU Sales (in mio)"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="EU Sales Amount by Publisher") %>% 
  layout(title="EU Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Publisher,
           name="EU Sales Amount by Publisher") %>% 
  layout(title="EU Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )
grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n(),sum(NA_Sales)) %>%
  filter(Anzahl>100) %>%
rename(
    Global_Sales = "sum(NA_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "NA Sales (in mio)"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="NA Sales Amount by Publisher") %>% 
  layout(title="NA Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Publisher,textinfo='label+percent',
           name="NA Sales Amount by Publisher") %>% 
  layout(title="NA Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )
grouped <- vgsales  %>% 
  group_by(Publisher) %>% 
  summarize(Anzahl =n(),sum(JP_Sales)) %>%
  filter(Anzahl>100) %>%
rename(
    Global_Sales = "sum(JP_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]
ordered$Publisher <-str_remove_all(ordered$Publisher, "Entertainment")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Interactive")
ordered$Publisher <-str_remove_all(ordered$Publisher, "Studios")
ordered$Publisher <- as_factor(ordered$Publisher)


ax <- list(
  title = "Publisher"
)

ay <- list(
  title = "JP Sales (in mio)"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Publisher,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="JP Sales Amount by Publisher") %>% 
  layout(title="JP Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Publisher,
           name="JP Sales Amount by Publisher") %>% 
  layout(title="JP Sales Amount by Publisher",
         xaxis = ax,
         yaxis = ay
         )

Zwischen Eu und US lassen sich hier kaum Unterschiede feststellen in Japan hingegen ist eine verschiebung zu erkennen. Japanische Publisher führen hierbei die Liste an und drängen andere große unternehmen von den Top spots.

Nun schauen wir uns die Genreverteilung von Videospielen an. Hierzu verwenden wir wiederum die Altbekannte sorted Bar/Pie-Chart kombo.

grouped <- vgsales  %>% 
  group_by(Genre) %>% 
  summarize(Anzahl =n())

grouped$Anzahl<-as_vector(grouped$Anzahl)
ordered <- grouped[order(grouped$Anzahl), decreasing = FALSE]
ordered$Genre <- as_factor(ordered$Genre)


ax <- list(
  title = "Genre"
)

ay <- list(
  title = "Anzahl"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Genre,Anzahl, .desc="true"),
           y=~Anzahl,
           name="Amount by Genre") %>% 
  layout(title="Amount by Genre",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Anzahl,labels=~Genre,
           name="Amount by Genre") %>% 
  layout(title="Amount by Genre",
         xaxis = ax,
         yaxis = ay
         )

Hierbei ist zu erkennen das Action und Sports ein Großteil (34%) der Genres ausmachen. Die Frage ist jedoch wie sind die Verkäufe verteilt und beeinflusst die anzahl der Games pro Genre irgendwie die Verkaufszahlen?


grouped <- vgsales  %>% 
  group_by(Genre) %>% 
  summarize(sum(Global_Sales))  %>%
rename(
    Global_Sales = "sum(Global_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]

ax <- list(
  title = "Genre"
)

ay <- list(
  title = "Sales"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Genre,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales by Genre") %>% 
  layout(title="Sales by Genre",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Genre,
           name="Sales by Genre") %>% 
  layout(title="Sales by Genre",
         xaxis = ax,
         yaxis = ay
        )

Hierbei erkennen wir das es einige Unterschiede gibt Action und sports machen jedoch weiterhin einen Grosteil des Markts aus.

Nun schauen wir uns die Unterscheide in den Regionen an.


grouped <- vgsales  %>% 
  group_by(Genre) %>% 
  summarize(sum(EU_Sales))  %>%
rename(
    Global_Sales = "sum(EU_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]

ax <- list(
  title = "Genre"
)

ay <- list(
  title = "Sales"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Genre,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales by Genre (EU)") %>% 
  layout(title="Sales by Genre (EU)",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Genre,
           name="Sales by Genre (EU)") %>% 
  layout(title="Sales by Genre (EU)",
         xaxis = ax,
         yaxis = ay
        )

grouped <- vgsales  %>% 
  group_by(Genre) %>% 
  summarize(sum(NA_Sales))  %>%
rename(
    Global_Sales = "sum(NA_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]

ax <- list(
  title = "Genre"
)

ay <- list(
  title = "Sales"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Genre,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales by Genre (NA)") %>% 
  layout(title="Sales by Genre (NA)",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Genre,
           name="Sales by Genre (NA)") %>% 
  layout(title="Sales by Genre (NA)",
         xaxis = ax,
         yaxis = ay
        )

grouped <- vgsales  %>% 
  group_by(Genre) %>% 
  summarize(sum(JP_Sales))  %>%
rename(
    Global_Sales = "sum(JP_Sales)"
    )
grouped$Global_Sales<-as_vector(grouped$Global_Sales)
ordered <- grouped[order(grouped$Global_Sales), decreasing = FALSE]

ax <- list(
  title = "Genre"
)

ay <- list(
  title = "Sales"

)

ordered%>%
  plot_ly() %>% 
  add_bars(x=~fct_reorder(Genre,Global_Sales, .desc="true"),
           y=~Global_Sales,
           name="Sales by Genre (JP)") %>% 
  layout(title="Sales by Genre (JP)",
         xaxis = ax,
         yaxis = ay
         )

ordered%>%
  plot_ly() %>% 
  add_pie(values =~Global_Sales,labels=~Genre,
           name="Sales by Genre (JP)") %>% 
  layout(title="Sales by Genre (JP)",
         xaxis = ax,
         yaxis = ay
        )

Hierbei erkennen wir wieder einmal das US und EU recht ähnlich sind wohingegen Japan ein gänzlich anderes Genreshema erkennen lässt. In Japan dominiert Role-Playing welches sich in EU und US nur auf platz 7 befindet.

Nun schauen wir uns die Genreentwicklung über die Jahre an. Hierzu verwenden wir ein LinePlot sowie verschieden Scatter Plots.


grouped <- vgsales  %>%                                 
  group_by(Year, Genre) %>%
  dplyr::summarize(Anzahl =n()) %>% filter(Year!='N/A')%>%filter(Year!=2020) %>% filter(Year!='2017') %>%
  as.data.frame()
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
filtered <- grouped %>% select(Year,Genre,Anzahl)
ax <- list(
  title = "Year"
)

ay <- list(
  title = "Anzahl"

)

filtered %>%
plot_ly() %>% 
  add_lines(x=~Year,
           y=~Anzahl, color=~Genre)
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
filtered %>%
plot_ly(x = ~Year, y = ~Anzahl, type = 'scatter', mode = 'none', fill = 'tozeroy',color = ~Genre)%>% 
  layout(title="Amount by Genre from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
filtered %>%
plot_ly(x = ~Year, y = ~Anzahl, type = 'scatter', mode = 'none', stackgroup = 'one',color = ~Genre)%>% 
  layout(title="Amount by Genre from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
ay <- list(
  title = "Percent %"

)

filtered %>%
plot_ly(x = ~Year, y = ~Anzahl, type = 'scatter', mode = 'none', stackgroup = 'one',groupnorm = 'percent',color = ~Genre)%>% 
  layout(title="Marketshae Genreshift in % from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Nun stellt sich die Frage wi


grouped <- vgsales  %>%                                 
  group_by(Year, Genre) %>%
  dplyr::summarize(gr_sum = sum(Global_Sales)) %>% filter(Year!='N/A')%>%filter(Year!=2020) %>% filter(Year!='2017') %>%
  as.data.frame()
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
filtered <- grouped %>% select(Year,Genre,gr_sum)

ax <- list(
  title = "Year"
)

ay <- list(
  title = "Global_Sales"

)

filtered %>%
plot_ly() %>% 
  add_lines(x=~Year,
           y=~gr_sum, color=~Genre) %>% 
  layout(title="Sales by Genre from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
filtered %>%
plot_ly(x = ~Year, y = ~gr_sum, type = 'scatter', mode = 'none', fill = 'tozeroy',color = ~Genre) %>% 
  layout(title="Sales by Genre from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
filtered %>%
plot_ly(x = ~Year, y = ~gr_sum, type = 'scatter', mode = 'none', stackgroup = 'one',color = ~Genre)%>% 
  layout(title="Sales by Genre from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
ay <- list(
  title = "Percent %"

)
filtered %>%
plot_ly(x = ~Year, y = ~gr_sum, type = 'scatter', mode = 'none', stackgroup = 'one',groupnorm = 'percent',color = ~Genre,fillcolors ="Paired")%>% 
  layout(title="Marketshare genreshift in % from 1980-2016",
         xaxis = ax,
         yaxis = ay
         )
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning in RColorBrewer::brewer.pal(N, "Set2") :
  n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors

Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]
Warning: 'scatter' objects don't have these attributes: 'fillcolors'
Valid attributes include:
'cliponaxis', 'connectgaps', 'customdata', 'customdatasrc', 'dx', 'dy', 'error_x', 'error_y', 'fill', 'fillcolor', 'groupnorm', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hoveron', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'orientation', 'selected', 'selectedpoints', 'showlegend', 'stackgaps', 'stackgroup', 'stream', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'unselected', 'visible', 'x', 'x0', 'xaxis', 'xcalendar', 'xhoverformat', 'xperiod', 'xperiod0', 'xperiodalignment', 'xsrc', 'y', 'y0', 'yaxis', 'ycalendar', 'yhoverformat', 'yperiod', 'yperiod0', 'yperiodalignment', 'ysrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_ [... truncated]

Nun stellt sich die Frage hab sich die Verkäufe ähnlich der anzahl der GameReleases entwickelt?

LS0tDQp0aXRsZTogIlZEQSBQcm9qZWt0Ig0Kb3V0cHV0OiANCiAgIGh0bWxfZG9jdW1lbnQgOiANCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIGh0bWxfbm90ZWJvb2sgOiANCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIA0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRSwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGtuaXRyLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFLCBxdWlldGx5PVRSVUUpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZHlncmFwaHMpDQpsaWJyYXJ5KHh0cykNCm15UGFsZXR0ZSA8LSBicmV3ZXIucGFsKDgsICJZbEduIikNCnZnc2FsZXMgPC0gcmVhZF9jc3YoInZnc2FsZXMuY3N2IikNCmBgYA0KRGllIGlkZWUgZGVzIFByb2pla3RzIGlzdCBkaWUgQW5hbHlzZSBkZXIgVmlkZW8gR2FtZSBSZWxlYXNlcyBpbSBsYXVmZSBkZXIgSmFocmUgdm9uIDE5ODAtMjAxNi4NCg0KDQpadWVyc3Qgc2NoYXVlbiB3aXIgdW5kIHNpZSBBbnphaGwgZGVyIFZpZGVvc3BpZWxlIHVuZCBkaWUgQW56YWhsIGRlciB2ZXJrw6R1ZmUgaW0gbGF1ZmUgZGVyIEphaHJlIGFuLg0KSGllcnp1IHZlcndlbmRlbiB3aXIgU2NhdHRlciBQbG90cw0KDQoNCmBgYHtyIHBsb3QoQW1vdW50QnlZZWFyKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCg0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZ3JvdXBfYnkoWWVhcikgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUoQW56YWhsID1uKCkpICU+JSBmaWx0ZXIoWWVhciE9J04vQScpJT4lZmlsdGVyKFllYXIhPTIwMjApICU+JSBmaWx0ZXIoWWVhciE9JzIwMTcnKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQoNCg0KZmlsdGVyZWQgPC0gZ3JvdXBlZCAlPiUgc2VsZWN0KFllYXIsQW56YWhsKQ0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJZZWFyIg0KKQ0KDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJBbW91bnQiDQoNCikNCg0KZmlsdGVyZWQgJT4lDQpwbG90X2x5KHggPSB+WWVhciwgeSA9IH5BbnphaGwsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCBmaWxsID0gJ3RvemVyb3knKSAlPiUgDQogIGxheW91dCh0aXRsZT0iR2FtZSBBbW91bnQgZnJvbSAxOTgwLTIwMTYiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCg0KYGBgDQoNCmBgYHtyIHBsb3QoR2FtZVNhbGVzQnlZZWFyKSwgaW5jbHVkZT1UUlVFLCBlY2hvID0gVFJVRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0nbWFya3VwJywgfQ0KDQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBncm91cF9ieShZZWFyKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShncl9zdW0gPSBzdW0oR2xvYmFsX1NhbGVzKSkgJT4lIGZpbHRlcihZZWFyIT0nTi9BJyklPiVmaWx0ZXIoWWVhciE9MjAyMCkgJT4lIGZpbHRlcihZZWFyIT0nMjAxNycpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCg0KDQpmaWx0ZXJlZCA8LSBncm91cGVkICU+JSBzZWxlY3QoWWVhcixncl9zdW0pDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlllYXIiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIlNhbGVzIFBlciBHYW1lIChpbiBtaW8pIg0KDQopDQoNCmZpbHRlcmVkICU+JQ0KcGxvdF9seSh4ID0gflllYXIsIHkgPSB+Z3Jfc3VtLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgZmlsbCA9ICd0b3plcm95JykgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIHBlciBHYW1lIGZyb20gMTk4MC0yMDE2IiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCmBgYA0KDQpgYGB7ciBwbG90KFNhbGVzYnlHYW1lQnlZZWFyKSwgaW5jbHVkZT1UUlVFLCBlY2hvID0gVFJVRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0nbWFya3VwJywgfQ0KDQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBncm91cF9ieShZZWFyKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShncl9zdW0gPSBzdW0oR2xvYmFsX1NhbGVzKS9uKCkpICU+JSBmaWx0ZXIoWWVhciE9J04vQScpJT4lZmlsdGVyKFllYXIhPTIwMjApICU+JSBmaWx0ZXIoWWVhciE9JzIwMTcnKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQoNCg0KZmlsdGVyZWQgPC0gZ3JvdXBlZCAlPiUgc2VsZWN0KFllYXIsZ3Jfc3VtKQ0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJZZWFyIg0KKQ0KDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJTYWxlcyBwZXIgWWVhcihpbiBtaW8pIg0KDQopDQoNCmZpbHRlcmVkICU+JQ0KcGxvdF9seSh4ID0gflllYXIsIHkgPSB+Z3Jfc3VtLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgZmlsbCA9ICd0b3plcm95JykgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIHBlciBHYW1lIGZyb20gMTk4MC0yMDE2IiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCmBgYA0KSGllciBlcmtlbm5lbiB3aXIgZGFzIDIwMDggdW5kIDIwMDkgZGllIEphaHJlIHdhcmVuIGluIGRlbmVuIGRpZSBNZWlzdGVuIEdhbWVzIFJlbGVhc3Qgd3VyZGVuIHVuZCBkaWVzZSBhdWNoIGRpZSBtZWlzdGVuIFZlcmvDpHVmZSBoYWJlbi4NCkRlbiBncsO2w590ZW4gcGVyIEdhbWUgVmVya2F1ZnN3ZXJ0IGdhYiBlcyBhbGxlcmRpbmdzIDE5ODQsMTk4NSB1bmQgMTk4OS4gTmV1ZXJlIHNwaWVsZSBoaW5nZWdlbiB2ZXJrYXVmZW4gc2ljaCBkdXJjaHNjaG5pdHRsaWNoIHNjaGxlY2h0ZXIgd2FzIGR1cmNoIGRhcyBncsO2w59lcmUgQW5nZWJvdCBhdWNoIHp1IGVyd2FydGVuIGlzdC4NCg0KTnVuIGJldHJhY2h0ZW4gd2lyIGRpZSBBbnphaGwgZGVyIFZpZGVvc3BpZWxlIGF1ZmdlbGlzdGV0IG5hY2ggUGxhdGZvcm0uDQpgYGB7ciBub3Bsb3QsIGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdtYXJrdXAnLCBpbmNsdWRlID1GQUxTRSx9DQp2Z3NhbGVzICU+JSANCiAgcGxvdF9seSgNCiAgICB4PX5QbGF0Zm9ybSwNCiAgICBzdHJva2U9SSgiYmxhY2siKSwNCiAgICBuYW1lPSJBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlPSJBbW91bnQgYnkgUGxhdGZvcm0iKQ0KdmdzYWxlcyAlPiUgDQogIHBsb3RfbHkgJT4lIA0KICBhZGRfYm94cGxvdCgNCiAgICB4PX5QbGF0Zm9ybSwNCiAgICBzdHJva2U9SSgiYmxhY2siKSwNCiAgICBuYW1lPSJBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCgNCiAgICB0aXRsZT0iQW1vdW50IGJ5IFBsYXRmb3JtIikNCg0KdmdzYWxlcyAlPiUgDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKA0KICAgIHg9fkdsb2JhbF9TYWxlcywNCiAgICB5PX5QbGF0Zm9ybSwNCiAgICBuYW1lPSJTYWxlcyBieSBQbGF0Zm9ybSAoaW4gbWlvKSIpICU+JSANCiAgbGF5b3V0KA0KICAgIHRpdGxlPSJTYWxlcyBieSBQbGF0Zm9ybSAoaW4gbWlvKSIpDQoNCmBgYA0KSGllcmJlaSBzdGVsbHQgc2ljaCBkaWUgRnJhZ2Ugb2Igw6RsdGVyZSBQbGF0dGZvcm1lbiBtZWhyIFNwaWVsZXJlbGVhc2VzIGhhYmVuIHdvdm9uIGF1c3p1Z2VoZW4gaXN0Lg0KSGllcnp1IHZlcndlbmRlbiB3aXIgZWluIGVpbmZhY2hlcyBCYWxrZW5kaWFncmFtbSB3ZWxjaGUgZWluZSBndXRlIGVyc3RlIMO8YmVyc2ljaHQgYmlldGV0Lg0KYGBge3IgcGxvdCwgZWNobyA9IFRSVUUsbWVzc2FnZT1GQUxTRSxyZXN1bHRzPSdtYXJrdXAnLH0NCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShQbGF0Zm9ybSkgJT4lIA0KICBzdW1tYXJpemUoQW56YWhsID1uKCkpIA0KDQpvcmRlcmVkIDwtIGdyb3VwZWRbb3JkZXIoZ3JvdXBlZCRBbnphaGwpLCBkZWNyZWFzaW5nID0gRkFMU0VdDQpvcmRlcmVkJFBsYXRmb3JtIDwtIGFzX2ZhY3RvcihvcmRlcmVkJFBsYXRmb3JtKQ0KDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlB1Ymxpc2hlciINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiQW56YWhsIg0KKQ0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihQbGF0Zm9ybSxBbnphaGwsIC5kZXNjPSJ0cnVlIiksDQogICAgICAgICAgIHk9fkFuemFobCwNCiAgICAgICAgICAgbmFtZT0iR2FtZSBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iR2FtZSBBbW91bnQgYnkgUGxhdGZvcm0iLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgIA0KICAgICAgICAgKQ0KYGBgDQpEaWVzIGzDpHNzdCBzaWNoIG5pY2h0IGdlbmVyZWxsIGJlc3TDpHRpZ2VuIGFiZXIgZWluIFRyZW5kIGlzdCBkZWZpbml0aXYgZXJrZW5uYmFyLg0KDQoNCk51biBzdGVsbHQgc2ljaCBkaWUgRnJhZ2Ugd2VsY2hlIFBsYXR0Zm9ybSBkaWUgbWVpc3RlbiBTYWxlcyBoYXQuDQoNCmBgYHtyIHBsb3QoUGxhdGZvcm1SYW5raW5nX0dsb2JhbCksIGVjaG8gPSBUUlVFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0nbWFya3VwJyx9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUGxhdGZvcm0pICU+JSANCiAgc3VtbWFyaXplKHN1bShHbG9iYWxfU2FsZXMpKSAgJT4lDQpyZW5hbWUoDQogICAgR2xvYmFsX1NhbGVzID0gInN1bShHbG9iYWxfU2FsZXMpIg0KICAgICkNCmdyb3VwZWQkR2xvYmFsX1NhbGVzPC1hc192ZWN0b3IoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpDQpvcmRlcmVkIDwtIGdyb3VwZWRbb3JkZXIoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpLCBkZWNyZWFzaW5nID0gRkFMU0VdDQpvcmRlcmVkJFBsYXRmb3JtIDwtIGFzX2ZhY3RvcihvcmRlcmVkJFBsYXRmb3JtKQ0KDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlBsYXRmb3JtIg0KKQ0KDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJHbG9iYWwgU2FsZXMgKGluIG1pbykiDQoNCikNCg0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFBsYXRmb3JtLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpgYGANCldpZSBzaWNoIGhlcmF1c3N0ZWxsdCBpc3QgZGllcyBqZWRvY2ggbmljaHQgZGllIFBsYXRmb3JtIHdlbGNoZXMgZGllIG1laXN0ZW4gR2FtZXJlbGVhc2VzIGhhdC4NCg0KTnVuIGFuYWx6c2llcmVuIHdpciBkaWUgdW50ZXJzY2hpZWRlIGRlciBSZWdpb25lbi4NCg0KSGllcnp1IHZlcndlbmRlbiB3aXIgU293b2hsIHNvcnRlZCBiYXIgcGxvdHMgc293aWUgZGVyIGFid2VjaHNsdW5nc2hhbGJlciBwaWUgY2hhcnRzLg0KDQpFaW56dXdlbmRlbiBoaWVyYmVpIGlzdCBkYXMgZGllIFJlZ2lvbmVuIG5hdMO8cmxpY2ggdW50ZXJzY2hpZWRsaWNoIHZpZWxlIEVpbndvaG5lciBoYWJlbiBlaW4gdmVyZ2xlaWNoIGRlciBBYnNvbHV0ZW4gU2FsZXN3ZXJ0ZSBpc3QgaGllcmJlaSBuYXTDvHJsaWNoIG51ciB3ZW5pZyBhdXNzY2hsYWdnZWJlbmQgemVpZ3QgYWJlciBlaW5lbiBnZW5lcmVsbGVuIGJlbGllYnRoZWl0c3RyZW5kIGRlciBLb25zb2xlbiBhdWYuDQpgYGB7ciBwbG90KFBsYXRmb3JtUmFua2luZ19FVSksIGVjaG8gPSBUUlVFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0nbWFya3VwJyx9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUGxhdGZvcm0pICU+JSANCiAgc3VtbWFyaXplKHN1bShFVV9TYWxlcykpICAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKEVVX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQbGF0Zm9ybSA8LSBhc19mYWN0b3Iob3JkZXJlZCRQbGF0Zm9ybSkNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQbGF0Zm9ybSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiRVUgU2FsZXMgKGluIG1pbykiDQoNCikNCg0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFBsYXRmb3JtLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJFVSBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iRVUgU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+R2xvYmFsX1NhbGVzLGxhYmVscz1+UGxhdGZvcm0sdGV4dGluZm89J2xhYmVsK3BlcmNlbnQnLA0KICAgICAgICAgICBuYW1lPSJFVSBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IkVVIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KDQpgYGB7ciBwbG90KFBsYXRmb3JtUmFua2luZ19OQSksIGVjaG8gPSBUUlVFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0nbWFya3VwJyx9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUGxhdGZvcm0pICU+JSANCiAgc3VtbWFyaXplKHN1bShOQV9TYWxlcykpICAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKE5BX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQbGF0Zm9ybSA8LSBhc19mYWN0b3Iob3JkZXJlZCRQbGF0Zm9ybSkNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQbGF0Zm9ybSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiTkEgU2FsZXMgKGluIG1pbykiDQoNCikNCg0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFBsYXRmb3JtLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJOQSBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iTkEgU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+R2xvYmFsX1NhbGVzLGxhYmVscz1+UGxhdGZvcm0sdGV4dGluZm89J2xhYmVsK3BlcmNlbnQnLA0KICAgICAgICAgICBuYW1lPSJOQSBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIikgJT4lIA0KICBsYXlvdXQodGl0bGU9Ik5BIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KDQpgYGB7ciBwbG90KFBsYXRmb3JtUmFua2luZ19KUCksIGVjaG8gPSBUUlVFLG1lc3NhZ2U9RkFMU0UscmVzdWx0cz0nbWFya3VwJyx9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUGxhdGZvcm0pICU+JSANCiAgc3VtbWFyaXplKHN1bShKUF9TYWxlcykpICAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKEpQX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQbGF0Zm9ybSA8LSBhc19mYWN0b3Iob3JkZXJlZCRQbGF0Zm9ybSkNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQbGF0Zm9ybSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiSlAgU2FsZXMgKGluIG1pbykiDQoNCikNCg0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFBsYXRmb3JtLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJKUCBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iSlAgU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+R2xvYmFsX1NhbGVzLGxhYmVscz1+UGxhdGZvcm0sdGV4dGluZm89J2xhYmVsK3BlcmNlbnQnLA0KICAgICAgICAgICBuYW1lPSJKUCBTYWxlcyBBbW91bnQgYnkgUGxhdGZvcm0iKSAlPiUgDQogIGxheW91dCh0aXRsZT0iSlAgU2FsZXMgQW1vdW50IGJ5IFBsYXRmb3JtIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpgYGANCldvaGluZ2VnZW4gaW4gRVUgc29ueSBtaXQgZGVyIFBTMiB1bmQgUFMzIGRpZSBsaXN0ZSBhbmbDvGhydCBoYXQgaW4gZGVuIFVTQSBNaWNyb3NvZnQgbWl0IGRlciBYYm94MzYwIGRpZSBOYXNlIHZvcm4uIEluIEphcGFuIGhpbmdlZ2VuIGlzdCB3aWUgenUgZXJ3YXJ0ZW4gTmludGVuZG8gbWl0IGRlbSBEUyBkZXIgTWFya2bDvGhyZXIuDQoNClVtIHNpY2ggZGFzIEdhbnplIGV0d2FzIGdlbmF1ZXIgYW56dXNjaGF1ZW4gYmV0cmFjaHRlbiB3aXIgZGllIEFuemFobCBkZXIgU2FsZXMgcGVyIFBsYXRmb3JtIGltIFZlcmxhdWYgZGVyIEphaHJlLg0KDQpVbSBlaW5lIMO8YmVybGFkdW5nIGRlcyBEaWFncmFtbXMgenUgdmVyaGluZGVybiB3ZXJkZW4gaGllciBhbGxlcmRpbmdzIG51ciBQbGF0dGZvcm1lbiBtaXQgbWluZGVzdGVucyA2MCBtaW8gaW4gU2FsZXMgaW0gZW50c3ByZWNoZW5kZW4gSmFociBiZXLDvGNrc2ljaHRpZ3QuIERpZXMgaGF0IGRlbiBOYWNodGVpbCBkYXMgZWluaWdlIHouVCB3aWNodGlnZSBEYXRlbiBGZWhsZW4sIGVpbiBXZWdsYXNzZW4gZWJlbmplbmVzIEZpbHRlcnMgZsO8cnQgYWJlciB6dSBrb21wbGV0dGVyIHVuw7xiZXJzaWNodGxpY2hrZWl0Lg0KYGBge3IgcGxvdChTYWxlc1BlclBsYXRmb3JtYnlZZWFyKSwgaW5jbHVkZT1UUlVFLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCg0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZ3JvdXBfYnkoWWVhciwgUGxhdGZvcm0pICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKGdyX3N1bSA9IHN1bShHbG9iYWxfU2FsZXMpKSAlPiUgZmlsdGVyKFllYXIhPSdOL0EnKSU+JWZpbHRlcihZZWFyIT0yMDIwKSAlPiUgZmlsdGVyKFllYXIhPScyMDE3JykgICU+JSBmaWx0ZXIoZ3Jfc3VtPjYwKSU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCmdyb3VwZWQgPC0gZ3JvdXBlZCAlPiVhcnJhbmdlKGRlc2MoZ3Jfc3VtKSkgJT4lIA0KICBncm91cF9ieShZZWFyLCBQbGF0Zm9ybSkgJT4lDQogIHNsaWNlKDE6MykNCg0KZmlsdGVyZWQgPC0gZ3JvdXBlZCAlPiUgc2VsZWN0KFllYXIsUGxhdGZvcm0sZ3Jfc3VtKQ0KYXggPC0gbGlzdCgNCiAgdGl0bGUgPSAiWWVhciINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiU2FsZXMgcGVyIFBsYXRmb3JtIChpbiBtaW8pIg0KDQopDQoNCg0KZmlsdGVyZWQgJT4lDQpwbG90X2x5KHggPSB+WWVhciwgeSA9IH5ncl9zdW0sIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbm9uZScsIHN0YWNrZ3JvdXAgPSAnb25lJyxjb2xvciA9IH5QbGF0Zm9ybSklPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgcGVyIFBsYXRmb3JtIGZyb20gMTk4MC0yMDE2IiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCmBgYA0KSGllciBlcmtlbm5lbiB3aXIgZGFzIFBsYXRmb3JtLCB3aWUgenUgZXJ3YXJ0ZW4sIG1laXN0IGt1cnogbmFjaCBSZWxlYXNlIGRpZSBncsO2w590ZW4gdmVya8OkdWZlIHZlcnplaWNobmVuLg0KDQoNCg0KDQpOdW4gc3RlbGx0IHNpY2ggZGllIEZyYWdlIG9iIHNpY2ggbmViZW4gYmVzdGltbXRlbiBQbGF0Zm9ybWVuIGF1Y2ggYmVzdGltbXRlIEVudHdpY2tsZXIvUHVibGlzaGVyIGjDpHVmZW4uIEhpZXJiZWkgZ2VoZW4gd2lyIGRhdm9uIGF1cyBkYXMgdmVybXV0bGljaCBOaW50ZW5kbyB1bmQgRUEgZGllIGxpc3RlIGFuZsO8aHJlbi4NCkhpZXJ6dSB2ZXJ3ZW5kZW4gd2lyIHdpZWRlcnVtIHNvcnRlZCBCYXIgQ2hhcnRzIHVuZCBrw7xyemVuIGRpZSBOYW1lbiB1bmQgZGllIEJlZ3JpZmZlICJFbnRlcnRhaW5tZW50IiwgIkludGVyYWN0aXZlIiB1bmQgIlN0dWRpb3MiIGRhIGRpZXMgZGllIE5hbWVuIG51ciB1bm7DtnRpZyB2ZXJsw6RuZ2VydCB1bmQgRmlsdGVybiBQdWJsaXNoZXIgbWl0IEdlcmluZ2VuIEFuemFobCBhbiBHYW1lIFJlbGVhc2VzLg0KDQpgYGB7ciBwbG90MiwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShQdWJsaXNoZXIpICU+JSANCiAgc3VtbWFyaXplKEFuemFobCA9bigpKSAlPiUgIA0KICBmaWx0ZXIoQW56YWhsPjEwMCkgJT4lIGZpbHRlcihQdWJsaXNoZXIhPSJVbmtub3duIikNCg0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkQW56YWhsKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIkVudGVydGFpbm1lbnQiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIkludGVyYWN0aXZlIikNCm9yZGVyZWQkUHVibGlzaGVyIDwtc3RyX3JlbW92ZV9hbGwob3JkZXJlZCRQdWJsaXNoZXIsICJTdHVkaW9zIikNCm9yZGVyZWQkUHVibGlzaGVyIDwtIGFzX2ZhY3RvcihvcmRlcmVkJFB1Ymxpc2hlcikNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQdWJsaXNoZXIiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIkFuemFobCINCikNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX2JhcnMoeD1+ZmN0X3Jlb3JkZXIoUHVibGlzaGVyLEFuemFobCwgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+QW56YWhsLA0KICAgICAgICAgICBuYW1lPSJHYW1lIEFtb3VudCBieSBQdWJsaXNoZXIiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iR2FtZSBBbW91bnQgYnkgUHVibGlzaGVyIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICANCiAgICAgICAgICkNCmBgYA0KDQpgYGB7ciBwbG90KFB1Ymxpc2hlclJhbmtpbmdfR2xvYmFsKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShQdWJsaXNoZXIpICU+JSANCiAgc3VtbWFyaXplKEFuemFobCA9bigpLHN1bShHbG9iYWxfU2FsZXMpKSAlPiUNCiAgZmlsdGVyKEFuemFobD4xMDApICU+JQ0KcmVuYW1lKA0KICAgIEdsb2JhbF9TYWxlcyA9ICJzdW0oR2xvYmFsX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIkVudGVydGFpbm1lbnQiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIkludGVyYWN0aXZlIikNCm9yZGVyZWQkUHVibGlzaGVyIDwtc3RyX3JlbW92ZV9hbGwob3JkZXJlZCRQdWJsaXNoZXIsICJTdHVkaW9zIikNCm9yZGVyZWQkUHVibGlzaGVyIDwtIGFzX2ZhY3RvcihvcmRlcmVkJFB1Ymxpc2hlcikNCg0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJQdWJsaXNoZXIiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIkdsb2JhbCBTYWxlcyAoaW4gbWlvKSINCg0KKQ0KDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX2JhcnMoeD1+ZmN0X3Jlb3JkZXIoUHVibGlzaGVyLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KDQpBdWZmw6RsbGlnIGlzdCBoaWVyIGRpZSBkaXNrcmVwYW56IHp3aXNjaGVuIEFuemFobCBkZXIgU3BpZWxlcmVsZWFzZXMgdW5kIEFuemFobCBkZXIgU3BpZWxldmVya8OkdWZlLiBJbSBnZWdlbnNhdHogenUgZGVyIEFuemFobCBkZXIgU3BpZWxlIChiZWkgZGVtIE5pbnRlbmRvIG51ciBhdWYgcGxhdHogNiBTaXR6KSBkb21pbmllcnQgTmludGVuZG8gaW0gYW56YWhsIGRlciBTYWxlcy4NCg0KDQpOdW4gc3RlbGx0IHNpY2ggd2llZGVyIGVpbm1hbCBkaWUgRnJhZ2Ugb2Igc2ljaCBkaWVzIGluIEJlc3RpbW10ZW4gdGVpbGVuIGRlciBXZWx0IHVudGVyc2NoZWlkZXQgdW5kIGhpZXJ6dSB2ZXJ3ZW5kZW4gd2lyIHdpZWRlcnVtIGRpZSBTb3J0ZWRCYXIvUGllY2hhcnQga29tYm8gdW5kIGRpZSBiZXJlaXRzIGdlbmFubnRlbiBGaWx0ZXINCg0KYGBge3IgcGxvdChQdWJsaXNoZXJSYW5raW5nX0VVKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShQdWJsaXNoZXIpICU+JSANCiAgc3VtbWFyaXplKEFuemFobCA9bigpLHN1bShFVV9TYWxlcykpICU+JQ0KICBmaWx0ZXIoQW56YWhsPjEwMCkgJT4lDQpyZW5hbWUoDQogICAgR2xvYmFsX1NhbGVzID0gInN1bShFVV9TYWxlcykiDQogICAgKQ0KZ3JvdXBlZCRHbG9iYWxfU2FsZXM8LWFzX3ZlY3Rvcihncm91cGVkJEdsb2JhbF9TYWxlcykNCm9yZGVyZWQgPC0gZ3JvdXBlZFtvcmRlcihncm91cGVkJEdsb2JhbF9TYWxlcyksIGRlY3JlYXNpbmcgPSBGQUxTRV0NCm9yZGVyZWQkUHVibGlzaGVyIDwtc3RyX3JlbW92ZV9hbGwob3JkZXJlZCRQdWJsaXNoZXIsICJFbnRlcnRhaW5tZW50IikNCm9yZGVyZWQkUHVibGlzaGVyIDwtc3RyX3JlbW92ZV9hbGwob3JkZXJlZCRQdWJsaXNoZXIsICJJbnRlcmFjdGl2ZSIpDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiU3R1ZGlvcyIpDQpvcmRlcmVkJFB1Ymxpc2hlciA8LSBhc19mYWN0b3Iob3JkZXJlZCRQdWJsaXNoZXIpDQoNCg0KYXggPC0gbGlzdCgNCiAgdGl0bGUgPSAiUHVibGlzaGVyIg0KKQ0KDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJFVSBTYWxlcyAoaW4gbWlvKSINCg0KKQ0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFB1Ymxpc2hlcixHbG9iYWxfU2FsZXMsIC5kZXNjPSJ0cnVlIiksDQogICAgICAgICAgIHk9fkdsb2JhbF9TYWxlcywNCiAgICAgICAgICAgbmFtZT0iRVUgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJFVSBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX3BpZSh2YWx1ZXMgPX5HbG9iYWxfU2FsZXMsbGFiZWxzPX5QdWJsaXNoZXIsDQogICAgICAgICAgIG5hbWU9IkVVIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iRVUgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KYGBgDQoNCmBgYHtyIHBsb3QoUHVibGlzaGVyUmFua2luZ19OQSksIGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdtYXJrdXAnLCB9DQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoUHVibGlzaGVyKSAlPiUgDQogIHN1bW1hcml6ZShBbnphaGwgPW4oKSxzdW0oTkFfU2FsZXMpKSAlPiUNCiAgZmlsdGVyKEFuemFobD4xMDApICU+JQ0KcmVuYW1lKA0KICAgIEdsb2JhbF9TYWxlcyA9ICJzdW0oTkFfU2FsZXMpIg0KICAgICkNCmdyb3VwZWQkR2xvYmFsX1NhbGVzPC1hc192ZWN0b3IoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpDQpvcmRlcmVkIDwtIGdyb3VwZWRbb3JkZXIoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpLCBkZWNyZWFzaW5nID0gRkFMU0VdDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiRW50ZXJ0YWlubWVudCIpDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiSW50ZXJhY3RpdmUiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC1zdHJfcmVtb3ZlX2FsbChvcmRlcmVkJFB1Ymxpc2hlciwgIlN0dWRpb3MiKQ0Kb3JkZXJlZCRQdWJsaXNoZXIgPC0gYXNfZmFjdG9yKG9yZGVyZWQkUHVibGlzaGVyKQ0KDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlB1Ymxpc2hlciINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiTkEgU2FsZXMgKGluIG1pbykiDQoNCikNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihQdWJsaXNoZXIsR2xvYmFsX1NhbGVzLCAuZGVzYz0idHJ1ZSIpLA0KICAgICAgICAgICB5PX5HbG9iYWxfU2FsZXMsDQogICAgICAgICAgIG5hbWU9Ik5BIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iTkEgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+R2xvYmFsX1NhbGVzLGxhYmVscz1+UHVibGlzaGVyLHRleHRpbmZvPSdsYWJlbCtwZXJjZW50JywNCiAgICAgICAgICAgbmFtZT0iTkEgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJOQSBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpgYGANCg0KYGBge3IgcGxvdChQdWJsaXNoZXJSYW5raW5nX0pQKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShQdWJsaXNoZXIpICU+JSANCiAgc3VtbWFyaXplKEFuemFobCA9bigpLHN1bShKUF9TYWxlcykpICU+JQ0KICBmaWx0ZXIoQW56YWhsPjEwMCkgJT4lDQpyZW5hbWUoDQogICAgR2xvYmFsX1NhbGVzID0gInN1bShKUF9TYWxlcykiDQogICAgKQ0KZ3JvdXBlZCRHbG9iYWxfU2FsZXM8LWFzX3ZlY3Rvcihncm91cGVkJEdsb2JhbF9TYWxlcykNCm9yZGVyZWQgPC0gZ3JvdXBlZFtvcmRlcihncm91cGVkJEdsb2JhbF9TYWxlcyksIGRlY3JlYXNpbmcgPSBGQUxTRV0NCm9yZGVyZWQkUHVibGlzaGVyIDwtc3RyX3JlbW92ZV9hbGwob3JkZXJlZCRQdWJsaXNoZXIsICJFbnRlcnRhaW5tZW50IikNCm9yZGVyZWQkUHVibGlzaGVyIDwtc3RyX3JlbW92ZV9hbGwob3JkZXJlZCRQdWJsaXNoZXIsICJJbnRlcmFjdGl2ZSIpDQpvcmRlcmVkJFB1Ymxpc2hlciA8LXN0cl9yZW1vdmVfYWxsKG9yZGVyZWQkUHVibGlzaGVyLCAiU3R1ZGlvcyIpDQpvcmRlcmVkJFB1Ymxpc2hlciA8LSBhc19mYWN0b3Iob3JkZXJlZCRQdWJsaXNoZXIpDQoNCg0KYXggPC0gbGlzdCgNCiAgdGl0bGUgPSAiUHVibGlzaGVyIg0KKQ0KDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJKUCBTYWxlcyAoaW4gbWlvKSINCg0KKQ0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKFB1Ymxpc2hlcixHbG9iYWxfU2FsZXMsIC5kZXNjPSJ0cnVlIiksDQogICAgICAgICAgIHk9fkdsb2JhbF9TYWxlcywNCiAgICAgICAgICAgbmFtZT0iSlAgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJKUCBTYWxlcyBBbW91bnQgYnkgUHVibGlzaGVyIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX3BpZSh2YWx1ZXMgPX5HbG9iYWxfU2FsZXMsbGFiZWxzPX5QdWJsaXNoZXIsDQogICAgICAgICAgIG5hbWU9IkpQIFNhbGVzIEFtb3VudCBieSBQdWJsaXNoZXIiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iSlAgU2FsZXMgQW1vdW50IGJ5IFB1Ymxpc2hlciIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KYGBgDQpad2lzY2hlbiBFdSB1bmQgVVMgbGFzc2VuIHNpY2ggaGllciBrYXVtIFVudGVyc2NoaWVkZSBmZXN0c3RlbGxlbiBpbiBKYXBhbiBoaW5nZWdlbiBpc3QgZWluZSB2ZXJzY2hpZWJ1bmcgenUgZXJrZW5uZW4uIEphcGFuaXNjaGUgUHVibGlzaGVyIGbDvGhyZW4gaGllcmJlaSBkaWUgTGlzdGUgYW4gdW5kIGRyw6RuZ2VuIGFuZGVyZSBncm/Dn2UgdW50ZXJuZWhtZW4gdm9uIGRlbiBUb3Agc3BvdHMuDQoNCk51biBzY2hhdWVuIHdpciB1bnMgZGllIEdlbnJldmVydGVpbHVuZyB2b24gVmlkZW9zcGllbGVuIGFuLiBIaWVyenUgdmVyd2VuZGVuIHdpciB3aWVkZXJ1bSBkaWUgQWx0YmVrYW5udGUgc29ydGVkIEJhci9QaWUtQ2hhcnQga29tYm8uDQoNCmBgYHtyIHBsb3QoR2VucmVBbW91bnRfR0xvYmFsKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShHZW5yZSkgJT4lIA0KICBzdW1tYXJpemUoQW56YWhsID1uKCkpDQoNCmdyb3VwZWQkQW56YWhsPC1hc192ZWN0b3IoZ3JvdXBlZCRBbnphaGwpDQpvcmRlcmVkIDwtIGdyb3VwZWRbb3JkZXIoZ3JvdXBlZCRBbnphaGwpLCBkZWNyZWFzaW5nID0gRkFMU0VdDQpvcmRlcmVkJEdlbnJlIDwtIGFzX2ZhY3RvcihvcmRlcmVkJEdlbnJlKQ0KDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIkdlbnJlIg0KKQ0KDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJBbnphaGwiDQoNCikNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihHZW5yZSxBbnphaGwsIC5kZXNjPSJ0cnVlIiksDQogICAgICAgICAgIHk9fkFuemFobCwNCiAgICAgICAgICAgbmFtZT0iQW1vdW50IGJ5IEdlbnJlIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IkFtb3VudCBieSBHZW5yZSIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+QW56YWhsLGxhYmVscz1+R2VucmUsDQogICAgICAgICAgIG5hbWU9IkFtb3VudCBieSBHZW5yZSIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJBbW91bnQgYnkgR2VucmUiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KSGllcmJlaSBpc3QgenUgZXJrZW5uZW4gZGFzIEFjdGlvbiB1bmQgU3BvcnRzIGVpbiBHcm/Dn3RlaWwgKDM0JSkgZGVyIEdlbnJlcyBhdXNtYWNoZW4uIERpZSBGcmFnZSBpc3QgamVkb2NoIHdpZSBzaW5kIGRpZSBWZXJrw6R1ZmUgdmVydGVpbHQgdW5kIGJlZWluZmx1c3N0IGRpZSBhbnphaGwgZGVyIEdhbWVzIHBybyBHZW5yZSBpcmdlbmR3aWUgZGllIFZlcmthdWZzemFobGVuPw0KYGBge3IgcGxvdChTYWxlc0J5R2VucmVfR2xvYmFsKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCg0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgDQogIGdyb3VwX2J5KEdlbnJlKSAlPiUgDQogIHN1bW1hcml6ZShzdW0oR2xvYmFsX1NhbGVzKSkgICU+JQ0KcmVuYW1lKA0KICAgIEdsb2JhbF9TYWxlcyA9ICJzdW0oR2xvYmFsX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJHZW5yZSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiU2FsZXMiDQoNCikNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihHZW5yZSxHbG9iYWxfU2FsZXMsIC5kZXNjPSJ0cnVlIiksDQogICAgICAgICAgIHk9fkdsb2JhbF9TYWxlcywNCiAgICAgICAgICAgbmFtZT0iU2FsZXMgYnkgR2VucmUiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgYnkgR2VucmUiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfcGllKHZhbHVlcyA9fkdsb2JhbF9TYWxlcyxsYWJlbHM9fkdlbnJlLA0KICAgICAgICAgICBuYW1lPSJTYWxlcyBieSBHZW5yZSIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJTYWxlcyBieSBHZW5yZSIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICApDQpgYGANCkhpZXJiZWkgZXJrZW5uZW4gd2lyIGRhcyBlcyBlaW5pZ2UgVW50ZXJzY2hpZWRlIGdpYnQgQWN0aW9uIHVuZCBzcG9ydHMgbWFjaGVuIGplZG9jaCB3ZWl0ZXJoaW4gZWluZW4gR3Jvc3RlaWwgZGVzIE1hcmt0cyBhdXMuDQoNCk51biBzY2hhdWVuIHdpciB1bnMgZGllIFVudGVyc2NoZWlkZSBpbiBkZW4gUmVnaW9uZW4gYW4uDQpgYGB7ciBwbG90KFNhbGVzQnlHZW5yZV9FVSksIGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdtYXJrdXAnLCB9DQoNCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lIA0KICBncm91cF9ieShHZW5yZSkgJT4lIA0KICBzdW1tYXJpemUoc3VtKEVVX1NhbGVzKSkgICU+JQ0KcmVuYW1lKA0KICAgIEdsb2JhbF9TYWxlcyA9ICJzdW0oRVVfU2FsZXMpIg0KICAgICkNCmdyb3VwZWQkR2xvYmFsX1NhbGVzPC1hc192ZWN0b3IoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpDQpvcmRlcmVkIDwtIGdyb3VwZWRbb3JkZXIoZ3JvdXBlZCRHbG9iYWxfU2FsZXMpLCBkZWNyZWFzaW5nID0gRkFMU0VdDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIkdlbnJlIg0KKQ0KDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJTYWxlcyINCg0KKQ0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9iYXJzKHg9fmZjdF9yZW9yZGVyKEdlbnJlLEdsb2JhbF9TYWxlcywgLmRlc2M9InRydWUiKSwNCiAgICAgICAgICAgeT1+R2xvYmFsX1NhbGVzLA0KICAgICAgICAgICBuYW1lPSJTYWxlcyBieSBHZW5yZSAoRVUpIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIGJ5IEdlbnJlIChFVSkiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfcGllKHZhbHVlcyA9fkdsb2JhbF9TYWxlcyxsYWJlbHM9fkdlbnJlLA0KICAgICAgICAgICBuYW1lPSJTYWxlcyBieSBHZW5yZSAoRVUpIikgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIGJ5IEdlbnJlIChFVSkiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgKQ0KYGBgDQoNCmBgYHtyIHBsb3QoU2FsZXNCeUdlbnJlX05BKSwgZWNobyA9IFRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J21hcmt1cCcsIH0NCg0KZ3JvdXBlZCA8LSB2Z3NhbGVzICAlPiUgDQogIGdyb3VwX2J5KEdlbnJlKSAlPiUgDQogIHN1bW1hcml6ZShzdW0oTkFfU2FsZXMpKSAgJT4lDQpyZW5hbWUoDQogICAgR2xvYmFsX1NhbGVzID0gInN1bShOQV9TYWxlcykiDQogICAgKQ0KZ3JvdXBlZCRHbG9iYWxfU2FsZXM8LWFzX3ZlY3Rvcihncm91cGVkJEdsb2JhbF9TYWxlcykNCm9yZGVyZWQgPC0gZ3JvdXBlZFtvcmRlcihncm91cGVkJEdsb2JhbF9TYWxlcyksIGRlY3JlYXNpbmcgPSBGQUxTRV0NCg0KYXggPC0gbGlzdCgNCiAgdGl0bGUgPSAiR2VucmUiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIlNhbGVzIg0KDQopDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX2JhcnMoeD1+ZmN0X3Jlb3JkZXIoR2VucmUsR2xvYmFsX1NhbGVzLCAuZGVzYz0idHJ1ZSIpLA0KICAgICAgICAgICB5PX5HbG9iYWxfU2FsZXMsDQogICAgICAgICAgIG5hbWU9IlNhbGVzIGJ5IEdlbnJlIChOQSkiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgYnkgR2VucmUgKE5BKSIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KDQpvcmRlcmVkJT4lDQogIHBsb3RfbHkoKSAlPiUgDQogIGFkZF9waWUodmFsdWVzID1+R2xvYmFsX1NhbGVzLGxhYmVscz1+R2VucmUsDQogICAgICAgICAgIG5hbWU9IlNhbGVzIGJ5IEdlbnJlIChOQSkiKSAlPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgYnkgR2VucmUgKE5BKSIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICApDQpgYGANCg0KYGBge3IgcGxvdChTYWxlc0J5R2VucmVfSlApLCBlY2hvID0gVFJVRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0nbWFya3VwJywgfQ0KDQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSANCiAgZ3JvdXBfYnkoR2VucmUpICU+JSANCiAgc3VtbWFyaXplKHN1bShKUF9TYWxlcykpICAlPiUNCnJlbmFtZSgNCiAgICBHbG9iYWxfU2FsZXMgPSAic3VtKEpQX1NhbGVzKSINCiAgICApDQpncm91cGVkJEdsb2JhbF9TYWxlczwtYXNfdmVjdG9yKGdyb3VwZWQkR2xvYmFsX1NhbGVzKQ0Kb3JkZXJlZCA8LSBncm91cGVkW29yZGVyKGdyb3VwZWQkR2xvYmFsX1NhbGVzKSwgZGVjcmVhc2luZyA9IEZBTFNFXQ0KDQpheCA8LSBsaXN0KA0KICB0aXRsZSA9ICJHZW5yZSINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiU2FsZXMiDQoNCikNCg0Kb3JkZXJlZCU+JQ0KICBwbG90X2x5KCkgJT4lIA0KICBhZGRfYmFycyh4PX5mY3RfcmVvcmRlcihHZW5yZSxHbG9iYWxfU2FsZXMsIC5kZXNjPSJ0cnVlIiksDQogICAgICAgICAgIHk9fkdsb2JhbF9TYWxlcywNCiAgICAgICAgICAgbmFtZT0iU2FsZXMgYnkgR2VucmUgKEpQKSIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJTYWxlcyBieSBHZW5yZSAoSlApIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCm9yZGVyZWQlPiUNCiAgcGxvdF9seSgpICU+JSANCiAgYWRkX3BpZSh2YWx1ZXMgPX5HbG9iYWxfU2FsZXMsbGFiZWxzPX5HZW5yZSwNCiAgICAgICAgICAgbmFtZT0iU2FsZXMgYnkgR2VucmUgKEpQKSIpICU+JSANCiAgbGF5b3V0KHRpdGxlPSJTYWxlcyBieSBHZW5yZSAoSlApIiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICkNCmBgYA0KSGllcmJlaSBlcmtlbm5lbiB3aXIgd2llZGVyIGVpbm1hbCBkYXMgVVMgdW5kIEVVIHJlY2h0IMOkaG5saWNoIHNpbmQgd29oaW5nZWdlbiBKYXBhbiBlaW4gZ8OkbnpsaWNoIGFuZGVyZXMgR2VucmVzaGVtYSBlcmtlbm5lbiBsw6Rzc3QuIEluIEphcGFuIGRvbWluaWVydCBSb2xlLVBsYXlpbmcgd2VsY2hlcyBzaWNoIGluIEVVIHVuZCBVUyBudXIgYXVmIHBsYXR6IDcgYmVmaW5kZXQuDQoNCk51biBzY2hhdWVuIHdpciB1bnMgZGllIEdlbnJlZW50d2lja2x1bmcgw7xiZXIgZGllIEphaHJlIGFuLiBIaWVyenUgdmVyd2VuZGVuIHdpciBlaW4gTGluZVBsb3Qgc293aWUgdmVyc2NoaWVkZW4gU2NhdHRlciBQbG90cy4NCmBgYHtyIHBsb3QoQW1vdW50T2ZHYW1lc0J5R2VucmVieVllYXIpLCBlY2hvID0gVFJVRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0nbWFya3VwJywgfQ0KDQpncm91cGVkIDwtIHZnc2FsZXMgICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBncm91cF9ieShZZWFyLCBHZW5yZSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUoQW56YWhsID1uKCkpICU+JSBmaWx0ZXIoWWVhciE9J04vQScpJT4lZmlsdGVyKFllYXIhPTIwMjApICU+JSBmaWx0ZXIoWWVhciE9JzIwMTcnKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQoNCg0KZmlsdGVyZWQgPC0gZ3JvdXBlZCAlPiUgc2VsZWN0KFllYXIsR2VucmUsQW56YWhsKQ0KYXggPC0gbGlzdCgNCiAgdGl0bGUgPSAiWWVhciINCikNCg0KYXkgPC0gbGlzdCgNCiAgdGl0bGUgPSAiQW56YWhsIg0KDQopDQoNCmZpbHRlcmVkICU+JQ0KcGxvdF9seSgpICU+JSANCiAgYWRkX2xpbmVzKHg9flllYXIsDQogICAgICAgICAgIHk9fkFuemFobCwgY29sb3I9fkdlbnJlKQ0KDQoNCg0KZmlsdGVyZWQgJT4lDQpwbG90X2x5KHggPSB+WWVhciwgeSA9IH5BbnphaGwsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbm9uZScsIGZpbGwgPSAndG96ZXJveScsY29sb3IgPSB+R2VucmUpJT4lIA0KICBsYXlvdXQodGl0bGU9IkFtb3VudCBieSBHZW5yZSBmcm9tIDE5ODAtMjAxNiIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KDQpmaWx0ZXJlZCAlPiUNCnBsb3RfbHkoeCA9IH5ZZWFyLCB5ID0gfkFuemFobCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdub25lJywgc3RhY2tncm91cCA9ICdvbmUnLGNvbG9yID0gfkdlbnJlKSU+JSANCiAgbGF5b3V0KHRpdGxlPSJBbW91bnQgYnkgR2VucmUgZnJvbSAxOTgwLTIwMTYiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIlBlcmNlbnQgJSINCg0KKQ0KDQpmaWx0ZXJlZCAlPiUNCnBsb3RfbHkoeCA9IH5ZZWFyLCB5ID0gfkFuemFobCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdub25lJywgc3RhY2tncm91cCA9ICdvbmUnLGdyb3Vwbm9ybSA9ICdwZXJjZW50Jyxjb2xvciA9IH5HZW5yZSklPiUgDQogIGxheW91dCh0aXRsZT0iTWFya2V0YW1vdW50IGdlbnJlc2hpZnQgaW4gJSBmcm9tIDE5ODAtMjAxNiIsDQogICAgICAgICB4YXhpcyA9IGF4LA0KICAgICAgICAgeWF4aXMgPSBheQ0KICAgICAgICAgKQ0KYGBgDQpOdW4gc3RlbGx0IHNpY2ggZGllIEZyYWdlIHdpDQpgYGB7ciBwbG90KFNhbGVzQnlHZW5yZWJ5WWVhciksIGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdtYXJrdXAnLCB9DQoNCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGdyb3VwX2J5KFllYXIsIEdlbnJlKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShncl9zdW0gPSBzdW0oR2xvYmFsX1NhbGVzKSkgJT4lIGZpbHRlcihZZWFyIT0nTi9BJyklPiVmaWx0ZXIoWWVhciE9MjAyMCkgJT4lIGZpbHRlcihZZWFyIT0nMjAxNycpICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkNCg0KDQpmaWx0ZXJlZCA8LSBncm91cGVkICU+JSBzZWxlY3QoWWVhcixHZW5yZSxncl9zdW0pDQoNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlllYXIiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIkdsb2JhbF9TYWxlcyINCg0KKQ0KDQpmaWx0ZXJlZCAlPiUNCnBsb3RfbHkoKSAlPiUgDQogIGFkZF9saW5lcyh4PX5ZZWFyLA0KICAgICAgICAgICB5PX5ncl9zdW0sIGNvbG9yPX5HZW5yZSkgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIGJ5IEdlbnJlIGZyb20gMTk4MC0yMDE2IiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCg0KDQpmaWx0ZXJlZCAlPiUNCnBsb3RfbHkoeCA9IH5ZZWFyLCB5ID0gfmdyX3N1bSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdub25lJywgZmlsbCA9ICd0b3plcm95Jyxjb2xvciA9IH5HZW5yZSkgJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIGJ5IEdlbnJlIGZyb20gMTk4MC0yMDE2IiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQoNCmZpbHRlcmVkICU+JQ0KcGxvdF9seSh4ID0gflllYXIsIHkgPSB+Z3Jfc3VtLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ25vbmUnLCBzdGFja2dyb3VwID0gJ29uZScsY29sb3IgPSB+R2VucmUpJT4lIA0KICBsYXlvdXQodGl0bGU9IlNhbGVzIGJ5IEdlbnJlIGZyb20gMTk4MC0yMDE2IiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpheSA8LSBsaXN0KA0KICB0aXRsZSA9ICJQZXJjZW50ICUiDQoNCikNCmZpbHRlcmVkICU+JQ0KcGxvdF9seSh4ID0gflllYXIsIHkgPSB+Z3Jfc3VtLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ25vbmUnLCBzdGFja2dyb3VwID0gJ29uZScsZ3JvdXBub3JtID0gJ3BlcmNlbnQnLGNvbG9yID0gfkdlbnJlKSU+JSANCiAgbGF5b3V0KHRpdGxlPSJNYXJrZXRzaGFyZSBnZW5yZXNoaWZ0IGluICUgZnJvbSAxOTgwLTIwMTYiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmBgYA0KTnVuIHN0ZWxsdCBzaWNoIGRpZSBGcmFnZSBoYWIgc2ljaCBkaWUgVmVya8OkdWZlIMOkaG5saWNoIGRlciBhbnphaGwgZGVyIEdhbWVSZWxlYXNlcyBlbnR3aWNrZWx0Pw0KYGBge3IgcGxvdChTYWxlc1BlckdhbWVQZXJHZW5yZWJ5WWVhciksIGluY2x1ZGU9VFJVRSwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSdtYXJrdXAnLCB9DQoNCmdyb3VwZWQgPC0gdmdzYWxlcyAgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGdyb3VwX2J5KFllYXIsIEdlbnJlKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShncl9zdW0gPSBzdW0oR2xvYmFsX1NhbGVzKS9uKCkpICU+JSBmaWx0ZXIoWWVhciE9J04vQScpJT4lZmlsdGVyKFllYXIhPTIwMjApICU+JSBmaWx0ZXIoWWVhciE9JzIwMTcnKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQoNCg0KZmlsdGVyZWQgPC0gZ3JvdXBlZCAlPiUgc2VsZWN0KFllYXIsR2VucmUsZ3Jfc3VtKQ0KdmlldyhmaWx0ZXJlZCkNCmF4IDwtIGxpc3QoDQogIHRpdGxlID0gIlllYXIiDQopDQoNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIlNhbGVzIHBlciBHYW1lIg0KDQopDQoNCmZpbHRlcmVkICU+JQ0KcGxvdF9seSgpICU+JSANCiAgYWRkX2xpbmVzKHg9flllYXIsDQogICAgICAgICAgIHk9fmdyX3N1bSwgY29sb3I9fkdlbnJlKSAlPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgcGVyIEdhbWUgYnkgR2VucmUgZnJvbSAxOTgwLTIwMTYiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCg0KDQoNCmZpbHRlcmVkICU+JQ0KcGxvdF9seSh4ID0gflllYXIsIHkgPSB+Z3Jfc3VtLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ25vbmUnLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yID0gfkdlbnJlKSAlPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgcGVyIEdhbWUgYnkgR2VucmUgZnJvbSAxOTgwLTIwMTYiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCg0KZmlsdGVyZWQgJT4lDQpwbG90X2x5KHggPSB+WWVhciwgeSA9IH5ncl9zdW0sIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbm9uZScsIHN0YWNrZ3JvdXAgPSAnb25lJyxjb2xvciA9IH5HZW5yZSklPiUgDQogIGxheW91dCh0aXRsZT0iU2FsZXMgcGVyIEdhbWUgYnkgR2VucmUgZnJvbSAxOTgwLTIwMTYiLA0KICAgICAgICAgeGF4aXMgPSBheCwNCiAgICAgICAgIHlheGlzID0gYXkNCiAgICAgICAgICkNCmF5IDwtIGxpc3QoDQogIHRpdGxlID0gIlBlcmNlbnQgJSINCg0KKQ0KZmlsdGVyZWQgJT4lDQpwbG90X2x5KHggPSB+WWVhciwgeSA9IH5ncl9zdW0sIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbm9uZScsIHN0YWNrZ3JvdXAgPSAnb25lJyxncm91cG5vcm0gPSAncGVyY2VudCcsY29sb3IgPSB+R2VucmUpJT4lIA0KICBsYXlvdXQodGl0bGU9Ik1hcmtldHNoYXJlIGluIFNhbGVzIHBlciBHYW1lIGJ5IEdlbnJlIGZyb20gMTk4MC0yMDE2IiwNCiAgICAgICAgIHhheGlzID0gYXgsDQogICAgICAgICB5YXhpcyA9IGF5DQogICAgICAgICApDQpgYGA=